/*
@发源于 小朋友最近特别喜欢球。有一天他脑子抽了，从口袋里拿出了 N 个不同的球，想把它们放到 M 个相同的盒子里，并且要求每个盒子中至少要有一个球，
他好奇有几种放法，于是尝试编程实现，但由于他天天不好好学习，只会上 B 站看游泳教练，于是他向你求助。
输入格式
多组数据，每行两个数 N,M。
输出格式
每组数据一行，表示方案数。
*/


/////////   n个不同的球放入m个相同的盒子中 f[i][j]为前i个盒子放入j个球的总方案数 f[i][j]=f[i-1][j-1]+f[i][j-1]*i
/////////   前i个盒子放入j个球的方案数为 将第j个球单独放入第i个盒的方案数与将第j个球放入1-i任意一个盒子的方案数
#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define all(rq) rq.begin(),rq.end()
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)

using namespace std;
const int INF=0x3f3f3f3f;
void print_int128(__int128 x){
	if(x==0){
		putchar('0');
		return;
	}
	
	if(x<0){
		putchar('-');
		x=-x;
	}
	
	deque<char> s;
	while(x){
		s.push_front(x%10+'0');
		x/=10;
	}
	
	while(!s.empty()){
		putchar(s.front());
		s.pop_front();
	}
	
	return;
}

int main(){
	int n,m;
	while(cin>>n,cin>>m){
		vector<vector<__int128>> f(m+1,vector<__int128>(n+1));
		
		for(int i=1;i<=n;i++){
			f[1][i]=1;
		}
		
		for(int i=2;i<=m;i++){
			for(int j=1;j<=n;j++){
				f[i][j]=f[i-1][j-1]+f[i][j-1]*i;
			}
		}
		
		print_int128(f[m][n]);
		cout<<endl;
	} 
	return 0;
}